package com.scg33.inicio;

import java.io.File;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;

import org.zkoss.bind.annotation.AfterCompose;
import org.zkoss.bind.annotation.BindingParam;
import org.zkoss.bind.annotation.Command;
import org.zkoss.bind.annotation.Init;
import org.zkoss.bind.annotation.NotifyChange;
import org.zkoss.zul.Radio;
import org.zkoss.zul.Textbox;

import com.coreweb.Config;
import com.coreweb.SistemaPropiedad;
import com.coreweb.componente.BodyPopupAceptarCancelar;
import com.coreweb.componente.VerificaAceptarCancelar;
import com.coreweb.extras.email.EnviarCorreo;
import com.coreweb.util.MyArray;
import com.scg33.dominio.Acceso;
import com.scg33.dominio.Capitulo;
import com.scg33.dominio.RegisterDomain;
import com.scg33.util.RandomStringGenerator;
import com.sun.crypto.provider.DESCipher;

public class VMAcceso extends VMInicio {

	static String ID_NOVEDAD = "1";
	static String ID_ARCHIVOS = "2";
	static String ID_CALENDARIO = "3";
	static String ID_CONTACTO = "4";
	static String ID_ENVIAR_CORREO = "5";

	static String TITULO_ACCESO = "ACCESO";

	// Pagina principal
	static Hashtable<String, String[]> mappingAC = new Hashtable<String, String[]>();

	static {
		String[][] pagsDA = { { ID_NOVEDAD, "/scg33/acceso/novedades.zul", },
				{ ID_ARCHIVOS, "/scg33/acceso/archivos.zul", },
				{ ID_CALENDARIO, "/scg33/acceso/calendario.zul", },
				{ ID_CONTACTO, "/scg33/acceso/contactos.zul", },
				{ ID_ENVIAR_CORREO, "/scg33/acceso/enviarCorreo.zul", }, };

		cargaPaginas(pagsDA, mappingAC);
	}

	String usuario = "";
	String clave = "";
	String mensajeError = "";

	@Init(superclass = true)
	public void initVMComunicaciones() throws Exception {
		this.accesoIr(ID_CONTACTO);
	}

	@AfterCompose(superclass = true)
	public void afterComposeVMComunicaciones() {
	}

	// ========= Login =====================
	@Command
	@NotifyChange("*")
	public void salir() {
		this.setUsuarioLogout();
		this.usuario = "";
		this.clave = "";
	}

	@Command
	@NotifyChange("*")
	public void ingresar() throws Exception {

		if (this.login(this.usuario, this.clave) == true) {
			this.accesoPagina = this.getPagina(mappingAC, ID_NOVEDAD);
		} else {
			this.m.mensajePopupTemporalWarning("Acceso incorrecto");
		}

	}

	// =====================================

	public String getUsuario() {
		return usuario;
	}

	public void setUsuario(String usuario) {
		this.usuario = usuario;
	}

	public String getClave() {
		return clave;
	}

	public void setClave(String clave) {
		this.clave = clave;
	}

	public String getTitulo() {
		String out = TITULO_ACCESO;
		if (this.isUsuarioLogeado() == true) {
			out = this.getDto().getCapituloNombre().toUpperCase();
		}
		return out;
	}

	public String getMensajeError() {
		return mensajeError;
	}

	public void setMensajeError(String mensajeError) {
		this.mensajeError = mensajeError;
	}

	// =================== paginas ===========================
	String accesoPagina = this.getPagina(mappingAC, ID_NOVEDAD);


	@Command
	@NotifyChange("*")
	public void accesoIr(@BindingParam("index") String id) throws Exception {
		this.accesoPagina = this.getPagina(mappingAC, id);

		// si es novedad, refrescar
		if (id.compareTo(ID_NOVEDAD) == 0) {
			this.refrescarNovedades(this.getSessionAcceso());
		}


	}

	public String getAccesoPagina() {
		return accesoPagina;
	}

	public void setAccesoPagina(String accesoPagina) {
		this.accesoPagina = accesoPagina;
	}

	// ==================== Novedades ===========

	@Command
	@NotifyChange("*")
	public void agregarNovedad() throws Exception {
		if (this.dto.isSiAdministrador() == false) {
			return;
		}

		BodyPopupAceptarCancelar bac = new BodyPopupAceptarCancelar();
		Textbox titulo = new Textbox();
		titulo.setWidth("200px");

		Textbox descripcion = new Textbox();
		descripcion.setMultiline(true);
		descripcion.setRows(7);
		descripcion.setWidth("200px");

		bac.addComponente("Titulo", titulo);
		bac.addComponente("Novedad", descripcion);
		bac.setWidthWindows("350px");
		bac.setHighWindows("300px");
		bac.setCheckAC(new VerificarAgregarNovedad(titulo, descripcion));
		bac.showPopup("Agregar una novedad");

		if (bac.isClickAceptar() == true) {
			String t = titulo.getValue();
			String d = descripcion.getValue();

			RegisterDomain rr = RegisterDomain.getInstance();
			rr.agregarNovedad(this.dto.getNombre(), t, d,
					this.dto.getCapituloId());

			this.refrescarNovedades(this.getSessionAcceso());

		}

	}

	@Command
	@NotifyChange("*")
	public void eliminarNovedad(@BindingParam("dato") Object[] dato)
			throws Exception {
		if (this.dto.isSiAdministrador() == false) {
			return;
		}

		if (dato == null) {
			this.m.mensajePopupTemporal("Debe seleeccionar una novedad primero");
			return;
		}

		String msg = "" + dato[2];
		if (this.m.mensajeSiCancelar("Eliminar la novedad:\n" + msg) == Config.BOTON_YES) {
			RegisterDomain rr = RegisterDomain.getInstance();
			rr.eliminarNovedad(this.dto.getNombre(), this.dto.getCapituloId(),
					(Long) dato[0]);

			this.refrescarNovedades(this.getSessionAcceso());
		}
	}

	// ================ contactos ====================

	private RandomStringGenerator rsg = new RandomStringGenerator(3);

	String correoRemitente = "";
	String correoAsunto = "";
	String correoMensaje = "";
	String correoCaptcha = rsg.getRandomString();
	String correoCaptchaVerificar = "";

	@Command
	@NotifyChange("*")
	public void accesoRefrescarCapcha() {
		this.correoCaptcha = rsg.getRandomString();
	}

	public String getCorreoRemitente() {
		return correoRemitente;
	}

	public void setCorreoRemitente(String correoRemitente) {
		this.correoRemitente = correoRemitente;
	}

	public String getCorreoAsunto() {
		return correoAsunto;
	}

	public void setCorreoAsunto(String correoAsunto) {
		this.correoAsunto = correoAsunto;
	}

	public String getCorreoMensaje() {
		return correoMensaje;
	}

	public void setCorreoMensaje(String correoMensaje) {
		this.correoMensaje = correoMensaje;
	}

	public String getCorreoCaptcha() {
		return correoCaptcha;
	}

	public void setCorreoCaptcha(String correoCaptcha) {
		this.correoCaptcha = correoCaptcha;
	}

	public String getCorreoCaptchaVerificar() {
		return correoCaptchaVerificar;
	}

	public void setCorreoCaptchaVerificar(String correoCaptchaVerificar) {
		this.correoCaptchaVerificar = correoCaptchaVerificar;
	}

	private boolean esString(String s) {
		boolean out = false;
		if ((s != null) && (s.trim().length() > 0)) {
			out = true;
		}
		return out;
	}

	@Command
	@NotifyChange("*")
	public void accesoEnviarCorreo() throws Exception {
		this.m.mensajePopupTemporal("correo");

		String msgErr = "";
		boolean enviar = true;

		if (this.esString(correoRemitente) == false) {
			msgErr += "Debe ingresar un remitente\n";
			enviar = false;
		}

		if (this.esString(correoAsunto) == false) {
			msgErr += "Debe ingresar un asunto\n";
			enviar = false;

		}

		if (this.esString(correoMensaje) == false) {
			msgErr += "El mensaje está vacío\n";
			enviar = false;

		}

		if ((this.esString(correoCaptchaVerificar) == false)
				|| (correoCaptchaVerificar.compareTo(correoCaptcha) != 0)) {
			msgErr += "El código de verificación no corresponde\n";
			enviar = false;
		}

		if (enviar == true) {
			if (this.sisPro.siEnviarCorreoFormulario() == true) {
				EnviarCorreo ec = new EnviarCorreo();
				String[] to = { this.dto.getCapituloListaCorreo() };
				ec.sendMessage(to, new String[] {}, correoAsunto, correoMensaje);
			}
			this.m.mensajePopupTemporal("El correo a sido enviado");
			correoRemitente = "";
			correoAsunto = "";
			correoMensaje = "";
			correoCaptcha = rsg.getRandomString();
			correoCaptchaVerificar = "";
		} else {
			// error, no se puede enviar el correo
			msgErr = "Hay un error al completar el formulario: \n" + msgErr;
			this.m.mensajeError(msgErr);
		}

	}

	// ================================
	public boolean isModoAdm(){
		AccesoDTO acceso = this.getSessionAcceso();
		return acceso.isSiAdministrador();
	}
	
	
	public String getDirectorio() throws Exception {
		AccesoDTO acceso = this.getSessionAcceso();
		String dire = acceso.getCapituloDirectorio();
		if (dire.trim().length() == 0){
			// armo un directorio por default con la lista de correo
			String list = acceso.getCapituloListaCorreo();
			int pa = list.indexOf('@');
			list = list.substring(0,pa);
			
			SistemaPropiedad sp = new SistemaPropiedad();
			dire = sp.getPropiedad("DIRECTORIO_DEFAULT")+"/"+list;
			// crear el directorio
			File f = new File(dire);
			f.mkdirs();

			// hay que grabar el directorio
			RegisterDomain rr = RegisterDomain.getInstance();
			Capitulo ca = (Capitulo) rr.getObject(Capitulo.class.getName(), acceso.getCapituloId());
			ca.setDirectorio(dire);
			rr.saveObject(ca, this.getUsuario());
		}
		return dire;
	}
	
	public static void main(String[] args) {
		String list = "lista.2@danie";
		int pa = list.indexOf('@');
		list = list.substring(0,pa);
		System.out.println(list);
	}

}

/************************************************************************/
/************************************************************************/
/************************************************************************/
/************************************************************************/
/************************************************************************/
/************************************************************************/
/*************************************************************************
 * Verificar que se agrege una novedad
 * 
 * @author daniel
 * 
 */
class VerificarAgregarNovedad implements VerificaAceptarCancelar {

	Textbox titulo = null;
	Textbox descripcion = null;

	String textoErr = "";

	public VerificarAgregarNovedad(Textbox titulo, Textbox descripcion) {
		this.titulo = titulo;
		this.descripcion = descripcion;
	}

	@Override
	public boolean verificarAceptar() {
		boolean ok = true;
		textoErr = "";

		String t = this.titulo.getValue();
		if ((t == null) || (t.trim().length() == 0)) {
			textoErr += "Debe ingresar un título de la novedad.";
			ok = false;
		}

		String d = this.descripcion.getValue();
		if ((d == null) || (d.trim().length() == 0)) {
			textoErr += "Debe ingresar el texto de la novedad.";
			ok = false;
		}

		// TODO Auto-generated method stub
		return ok;
	}

	@Override
	public String textoVerificarAceptar() {
		return this.textoErr;
	}

	@Override
	public boolean verificarCancelar() {
		// TODO Auto-generated method stub
		return true;
	}

	@Override
	public String textoVerificarCancelar() {
		// TODO Auto-generated method stub
		return null;
	}

}
